% *******************************************
% SECTION
% *******************************************
\section{任务3: 第二关}

在本任务中，我们稍微提高攻击难度，将不显示一些关键信息。我们的目标服务器为 \texttt{10.9.0.6}。
\ifdefined\arm
端口号仍为 \texttt{9090}。
\else
端口号仍为 \texttt{9090}，且易受攻击的程序仍是32位程序。 
\fi
我们首先向此服务器发送一个正常消息。以下是由目标容器打印出的消息。

\ifdefined\arm

\begin{lstlisting}
// 在虚拟机（即攻击者机器）上
$ echo hello | nc 10.9.0.6 9090
Ctrl+C

// 容器中打印出来的消息
server-2-10.9.0.6  | Got a connection from 10.9.0.1
server-2-10.9.0.6  | Starting stack
server-2-10.9.0.6  | Input size: 6
server-2-10.9.0.6  | Buffer's address inside bof():     0x0000fffffffff3d0
server-2-10.9.0.6  | ==== Returned Properly ====
\end{lstlisting}

\else

\begin{lstlisting}
// 在虚拟机（即攻击者机器）上
$ echo hello | nc 10.9.0.6 9090
Ctrl+C

// 容器中打印出来的消息
server-2-10.9.0.6 | Got a connection from 10.9.0.1
server-2-10.9.0.6 | Starting stack
server-2-10.9.0.6 | Input size: 6
server-2-10.9.0.6 | Buffer's address inside bof():     0xffffda3c
server-2-10.9.0.6 | ==== Returned Properly ====
\end{lstlisting}

\fi

我们看到，服务器仅提供了一个线索，缓冲区的地址，而没有提供帧指针的值。这意味着缓冲区的大小是未知的，这使得利用该漏洞做攻击比第一级更加困难。
虽然实际的缓冲区大小可以在 \texttt{Makefile} 中找到，但在攻击中你不被允许使用这些信息，因为在现实世界中你大概率是看不到这个文件的。
为简化任务，我们假设缓冲区大小的范围是已知的。另一个对您可能有用的事实是，由于内存对齐的原因，在32位程序中帧指针的值总是4的倍数，在64位程序中则是8的倍数。

\begin{lstlisting}
缓冲区大小范围（以字节为单位）: [100, 200]
\end{lstlisting}

您的任务是构造一个payload来利用服务器上的缓冲区溢出漏洞，并通过反向shell技术在目标服务器上获取root shell。
\ifdefined\arm
与第一关任务类似，您的payload可以包含零值。 
\fi
请注意，您只能构造一个payload，它必须能应付该范围内的任何缓冲区大小。如果使用暴力破解方法（即每次尝试一个缓冲区大小），将无法获得全部分数。尝试次数越多，越容易被目标检测击败，因此减少尝试次数对于攻击来说至关重要。
在您的实验报告中，需要描述您的方法，并提供证据。